﻿using System;
using System.ComponentModel;
using System.Data;
using System.Data.SqlClient;
//using Microsoft.SqlServer.Management.Common;
using System.Windows.Forms;
using System.Threading;
using System.Threading.Tasks;
using Microsoft.SqlServer.Management.Smo;
using DevExpress.XtraEditors;
using DevExpress.XtraSplashScreen;
using DevExpress.XtraEditors.Controls;
using prjKQXS_UI.View;
using prjKQXS_DLL;
using prjKQXS_DLL.CSDL;

namespace prjKQXS_UI.CSDL
{
    public partial class frmRestore : XtraForm
    {
        clsDatabase _cls = new clsDatabase();

        public frmRestore()
        {
            InitializeComponent();
            _cls.OnMyPercentComplete += new clsDatabase.MyPercentCompleteEventHandler(_cls_OnMyPercentComplete);
            _cls.onOtherException += new clsDatabase.OnErrorHandler(_cls_OnUnhandleException);
        }
        //~frmRestore()
        //{
        //    _cls.OnMyPercentComplete -= new clsDatabase.MyPercentCompleteEventHandler(_cls_OnMyPercentComplete);
        //}

        private void frmRestore_FormClosing(object sender, FormClosingEventArgs e)
        {
            e.Cancel = !_cls._isCompleted && !beBackupFile.Enabled;
        }

        private void beBackupFile_ButtonClick(object sender, ButtonPressedEventArgs e)
        {
            OpenFileDialog ofd = new OpenFileDialog();
            ofd.FileOk += new CancelEventHandler(ofd_FileOk);
            ofd.Title = "Phục hồi dữ liệu";
            ofd.Filter = "Tệp tin sao lưu (*.bak)|*.bak| Tất cả các tệp (*.*)|*.*";
            ofd.ShowDialog();
        }

        bool compatible = false;
        private void ofd_FileOk(object sender, CancelEventArgs e)
        {
            beBackupFile.Text = (sender as OpenFileDialog).FileName;
            DataTable dt = _cls.readBackupHeader(beBackupFile.Text);
            int n = 25;
            meDetail.Text = "Backup Name".PadRight(n-2) + ": " + dt.Rows[0]["BackupName"].ToString().Trim()
                + "\r\nUser Name".PadRight(n) + ": " + dt.Rows[0]["UserName"].ToString().Trim()
                + "\r\nServer Name".PadRight(n) + ": " + dt.Rows[0]["ServerName"].ToString().Trim()
                + "\r\nDatabase Name".PadRight(n) + ": " + dt.Rows[0]["DatabaseName"].ToString().Trim()
                + "\r\nBackup Start Date".PadRight(n) + ": " + ((DateTime)dt.Rows[0]["BackupStartDate"]).ToString("dd/MM/yyyy hh:mm:ss tt").Trim()
                + "\r\nBackup Finish Date".PadRight(n) + ": " + ((DateTime)dt.Rows[0]["BackupFinishDate"]).ToString("dd/MM/yyyy hh:mm:ss tt").Trim()
                + "\r\nMachine Name".PadRight(n) + ": " + dt.Rows[0]["MachineName"].ToString().Trim()
                + "\r\n---------------------------------------------------------------------";

            if (dt.Rows[0]["BackupName"].ToString().Trim() != "KQXS 14.06.04")
            {
                if (dt.Rows[0]["DatabaseName"].ToString().Trim() == "KQXS" || dt.Rows[0]["BackupName"].ToString().Trim() == "ACMAN_DATABASE_BACKUP")
                {
                    meDetail.Text += "\r\n=> Tệp sao lưu có thể không tương thích với phiên bản hiện tại, tuy nhiên chương trình sẽ cố gắng chuyển đổi thành tương thích.";
                    compatible = false;
                    sbtnKhoiPhuc.Enabled = true;
                    sbtnKhoiPhuc.Text = "Chuyển đổi && khôi phục";
                }
                else
                {
                    meDetail.Text += "\r\n=> Tệp sao lưu không đúng. Bạn không thể phục hồi dữ liệu từ tệp này.";
                    sbtnKhoiPhuc.Enabled = false;
                }
            }
            else
            {
                meDetail.Text += "\r\n=> Tệp sao lưu hợp lệ. Bạn có thể phục hồi dữ liệu từ tệp này.";
                compatible = true;
                sbtnKhoiPhuc.Enabled = true;
                sbtnKhoiPhuc.Text = "Khôi phục";
            }
        }

        delegate void percentCompleteDelegate(int percent);
        private void _cls_OnMyPercentComplete(int percent)
        {
            if (InvokeRequired)
            {
                percentCompleteDelegate del = new percentCompleteDelegate(_cls_OnMyPercentComplete);
                BeginInvoke(del, percent);
                return;
            }

            progressBarControl1.Position = percent;
            progressBarControl1.Refresh();
            //this.Text = percent.ToString() + "_" + this.Text;
        }

        delegate void onUnHandleExceptionDelegate(Exception ex);
        private void _cls_OnUnhandleException(Exception ex)
        {
            if (InvokeRequired)
            {
                onUnHandleExceptionDelegate del = new onUnHandleExceptionDelegate(_cls_OnUnhandleException);
                BeginInvoke(del, ex);
                return;
            }

            string msg = "Một lối chưa được xử lý đã xảy ra.\nChi tiết lỗi:\n" + ex.Message;
            if (ex.InnerException != null) 
                msg += "\n----------\nInner exception (" + ex.InnerException.GetType() + "):\n" + ex.InnerException.Message;
            clsCommon.MsgBox(msg, 0);
        }

        delegate void restoreCompletedDelegate(bool state);
        private void onRestoreCompleted(bool successfull)
        {
            if (InvokeRequired)
            {
                restoreCompletedDelegate del = new restoreCompletedDelegate(onRestoreCompleted);
                BeginInvoke(del, successfull);
                return;
            }

            if (successfull)
            {
                progressBarControl1.Position = 100;
                progressBarControl1.Refresh();
                clsCommon.MsgBox("Phục hồi dữ liệu thành công", 1);
            }
            else
            {
                progressBarControl1.Position = 0;
                progressBarControl1.Refresh();
                if (_cls._currentDatabaseIsRestored)
                    clsCommon.MsgBox("Mọi thay đổi đã được hủy bỏ, dữ liệu hiện tại vẫn được giữ nguyên.", 5);
                else
                    clsCommon.MsgBox("Khôi phục dữ liệu không thành công.\nHãy sử dụng Microsoft SQL Server Management Studio để khôi phục lại dữ liệu.", 5);
            }

            beBackupFile.Enabled = true;
            progressBarControl1.Position = 0;
            progressBarControl1.Refresh();
        }

        private void sbtnKhoiPhuc_Click(object sender, EventArgs e)
        {
            meDetail.Focus();
            sbtnKhoiPhuc.Enabled = false;
            beBackupFile.Enabled = false;
            string msg = "Dữ liệu hiện tại sẽ được thay thế, bạn có chắc chắn muốn khôi phục dữ liệu?";
            if (!compatible)
                msg = "Nếu chuyển đổi thành công, dữ liệu hiện tại sẽ được thay thế.\nBạn có chắc chắn muốn khôi phục dữ liệu?";

            if (clsCommon.MsgBox(msg, 4) != DialogResult.Yes) return;

            if (compatible)
            {
                Task task = new Task(() =>
                    {
                        bool result = _cls.restore_IsCompatible(beBackupFile.Text);
                        onRestoreCompleted(result);
                    });
                task.Start();
                return;
            }
            else
            {
                Task task = new Task(() =>
                    {
                        bool result = _cls.restore_IsNotCompatible(beBackupFile.Text);
                        onRestoreCompleted(result);
                    });
                task.Start();
                return;
            }
        }
    }
}
